package com.movie.mapper;

import com.movie.entity.Showtime;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface ShowtimeMapper {

    /**
     * 根据电影 ID 查询所有相关场次
     * @param movieId 电影 ID
     * @return 场次列表
     */
    List<Showtime> findByMovieId(@Param("movieId") Long movieId);

    /**
     * 根据 ID 查询场次
     * @param id 场次 ID
     * @return 场次对象
     */
    Showtime findById(@Param("id") Long id);

    /**
     * 插入新的场次信息
     * @param showtime 场次对象
     * @return 影响的行数
     */
    int insert(Showtime showtime);

    /**
     * 分页查询场次信息，用于管理员后台
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 场次列表
     */
    List<Showtime> findAllPaged(@Param("offset") int offset, @Param("limit") int limit);

    /**
     * 查询场次总数
     * @return 总数
     */
    int countAll();

    /**
     * 根据 ID 删除场次
     * @param id 场次 ID
     * @return 影响的行数
     */
    int deleteById(@Param("id") Long id);

    /**
     * 更新场次信息
     * @param showtime 场次对象
     * @return 影响的行数
     */
    int update(Showtime showtime);

    /**
     * 更新场次可用座位数量
     * @param id 场次ID
     * @param availableSeats 可用座位数量
     * @return 影响的行数
     */
    int updateAvailableSeats(@Param("id") Long id, @Param("availableSeats") int availableSeats);

    /**
     * 查询指定影厅在特定时间段内的场次
     * @param hallName 影厅名称
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param excludeId 需要排除的场次ID（用于更新时排除自身）
     * @return 冲突的场次列表
     */
    List<Showtime> findConflictingShowtimes(@Param("hallName") String hallName,
                                           @Param("startTime") LocalDateTime startTime,
                                           @Param("endTime") LocalDateTime endTime,
                                           @Param("excludeId") Long excludeId);
}